package com.atguigu.spzx.manager.listener;

import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.atguigu.spzx.manager.mapper.CategoryMapper;
import com.atguigu.spzx.model.vo.product.CategoryExcelVo;

import java.util.ArrayList;
import java.util.List;

public class CategoryReadListener extends AnalysisEventListener<CategoryExcelVo> {


    //这里不能在监听类上加入@Component放入IOC容器,然后再这里@autowire注入.
    //原因是因为springmvc是单例多线程的,放入IOC容器了的话就是单例了,但是下面有个list容器,会导致多个线程共享一个容器,会出现数据错误
    private CategoryMapper categoryMapper;

    List<CategoryExcelVo> categoryExcelVoList=new ArrayList<>();

    //这里只弄一个有参构造,必须要这个mapper,不然下面逻辑无法执行,会导致空指针异常.
    public CategoryReadListener(CategoryMapper categoryMapper) {
        this.categoryMapper = categoryMapper;
    }

    @Override
    public void invoke(CategoryExcelVo categoryExcelVo, AnalysisContext analysisContext) {
        //每行读取完执行一次,并且每行的数据映射在categoryExcelVo参数里
        if (categoryExcelVoList.size()>50){
            //每50行批量存入数据库一次.
            /*System.out.println("存入数据库");*/
            //执行批量插入
            categoryMapper.insertCategory(categoryExcelVoList);
            //清空清空数据容器
            categoryExcelVoList.clear();
        }
        categoryExcelVoList.add(categoryExcelVo);
    }

    @Override
    public void doAfterAllAnalysed(AnalysisContext analysisContext) {
        //最终读取完执行一次
        //结束前剩余数据可能不够触发存入的数量,需要在最后进行一次存入
       /* System.out.println("最后一次存储");
        System.out.println("最后一次的数据个数为:"+categoryExcelVoList.size());*/
        categoryMapper.insertCategory(categoryExcelVoList);
        categoryExcelVoList.clear();
    }
}
